import java.io.IOException;

public class Pere extends Thread
 {
  private Process        process;
  private Tampon         tamponDEmission;
  private Tampon tamponDeTrace;
  private Tampon tamponDeReception;
  private HorlogeLamport horloge;
  private boolean testTirage=false;
  private int numTirage;
  
   
  public Pere (Process _process)
   {
    this.process = _process;
    this.tamponDEmission = this.process.getTamponDEmission();
    this.tamponDeTrace = this.process.getTamponDeTrace();
    this.tamponDeReception = this.process.getTamponDeReception();
    this.horloge = this.process.getHorloge();
   }
    
  @Override
  public void run()
   {
    MessageUtile message = null;
    boolean test = true;
    
    numTirage = (int) (Math.random() * 10);
    System.out.println(this.process.getNumProcess() + ": Numéro aléatoire du process  : " + this.numTirage );
    
    //Le process 1 démarre l'élection
    if (this.process.getNumProcess()==1)
    {
        MessageUtile messageElection = new MessageUtile ("ELEC",this.process.getNumProcess(), this.process.getNumProcess(),this.numTirage, 1);
        envoiMessage(messageElection);
    }
    
    while (test)
    {
      System.out.println (process.getNumProcess() + " : Pere      : Attente d'un message ---------------------------> " + horloge.getCompteur());
      message = receptionMessage();
           
      if(message.getContenu().equals("Fin"))
      {
    	    System.out.println("Fermeture du thread p�re du processus " + process.getNumProcess());
	    MessageUtile messageFin = new MessageUtile ("Fin",0,0);
            envoiMessage(messageFin);
    	    test=false;
      }
      else
      {    
          // Si l'id recu est égale à l'id du process fermeture il a gagné
          if (message.getIdProcessGagnant() == this.process.getNumProcess())
          {
                System.out.println (process.getNumProcess() + " : Pere      : Fermeture du SVG -------------------------------> " + horloge.getCompteur());
      		MessageUtile messageFin = new MessageUtile ("Fin",0,0);
      		envoiMessage(messageFin);
          }
          // Sinon suite de l'élection
          else
          {
              MessageUtile messageElection = null;
              horloge.incrementeHorloge();
              // Si nombre dans le message supérieur alors envoi du même message
              if (message.getNombre() > this.numTirage)
              {                  
                  messageElection = new MessageUtile ("ELEC",process.getNumProcess(), message.getIdProcessGagnant(),message.getNombre(), horloge.getCompteur());
                  
              }
              // Sinon le process met ses infos à lui
              else
              {
                  messageElection = new MessageUtile ("ELEC",process.getNumProcess(),this.process.getNumProcess(), numTirage, horloge.getCompteur());
              }
              envoiMessage(messageElection);
          }
      }
     }
   }
   
  public void envoiMessage (Message message)
   {
    tamponDEmission.setElementTampon (message);
    //horloge.incrementeHorloge(); 
    System.out.println (process.getNumProcess() + " : Pere      : Envoi d'un message -----------------------------> " + horloge.getCompteur());
   }
   
  public MessageUtile receptionMessage ()
   {
    MessageUtile message = (MessageUtile) tamponDeReception.getElementTampon();
    horloge.incrementeHorloge(message.getEstampille());
    envoiTrace (message);
    System.out.println (process.getNumProcess() + " : Pere      : Reception d'un message -------------------------> " + horloge.getCompteur());
    return message;
   }
   
  public void envoiTrace (MessageUtile message)
   {
    System.out.println (process.getNumProcess() + " : Pere      : Tracer --> " + message);
    Message ordre = new MessageOrdre (message.getContenu(), message.getIdProcess(), this.process.getNumProcess(), message.getEstampille(), this.horloge.getCompteur());      
    tamponDeTrace.setElementTampon (ordre);
    System.out.println (process.getNumProcess() + " : Pere      : Envoi de --> " + ordre);
   }
  
  public void changeTestTirage()
  {
      this.testTirage=true;
  }
  
  public void setNumTirage(int num)
  {
      this.numTirage=num;
  }
 }       
  

